#ifndef FSM_TEST1_0_LOGGER_H
#define FSM_TEST1_0_LOGGER_H

#endif //FSM_TEST1_0_LOGGER_H

#pragma once

#include <iostream>
#include <string>
#include <fstream>

//定义命名空间
namespace utility{

//定义宏让使用log函数更简单
#define error(format,...) \
    Logger::instance()->log(Logger::ERROR,__FILE__,__FILE__,format,##__VA_ARGS__);

#define warn(format,...) \
    Logger::instance()->log(Logger::WRAN,__FILE__,__FILE__,format,##__VA_ARGS__);

#define info(format,...) \
    Logger::instance()->log(Logger::INFO,__FILE__,__FILE__,format,##__VA_ARGS__);

    class Logger{
    public:
        //日志级别
        enum Level{
            ERROR,
            WARN,
            INFO,
            LEVEL_COUNT
        };

        static Logger * instance();
        //要打开一个文件
        void open(const std::string & filename);
        //文件用完需要关闭
        void close();
        //日志写入文件的函数
        void log(Level level,const char *file,const char *line,const char *format,...);
        //level是日志所在级别
        //file是日志要传入的文件
        //line是出问题的行号
        //format是日志的内容,是一个可变参数

    private:
        Logger();
        ~Logger();
        //单例模式

    private:
        std::string m_filename;  //表示记录到哪个文件
        std::ofstream m_fout;
        //为了方便记录日志级别声明一个静态的字符数组
        static const char *s_level[LEVEL_COUNT];
        static Logger *m_instance;     //全局唯一的实例
    };

}